package orders.db;

import orders.Order;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;

import java.util.List;

/**
 * @author XiaoDongLei
 * @Package com.vonzhou.springinaction.knights
 * @date 2018/4/1
 * @Description: Spring Data JPA支持方法命名约定
 *
 * 因为OrderRepository扩展了MongoRepository，因此它就会传递性地扩展Repository标记接口。回忆一下我们在学习Spring Data JPA时所了解的知识，任何扩展Repository的接口将会在运行时自动生成实现。
 * 
 * 在本例中，并不会实现与关系型数据库交互的JPA Repository，而是会为OrderRepository生成读取和写入数据到MongoDB文档数据库的实现。
 * 
 * MongoRepository接口有两个参数，第一个是带有@Document注解的对象类型，也就是该Repository要处理的类型。第二个参数是带有@Id注解的属性类型。
 * 
 * 尽管OrderRepository本身并没有定义任何方法，但是它会继承多个方法，包括对Order文档进行CRUD操作的方法。表12.2描述了OrderRepository继承的所有方法。
 * 
 * 表12.2　通过扩展MongoRepository，Repository接口能够继承多个CRUD操
 * 作，它们会由Spring Data MongoDB自动实现
 */
public interface OrderRepository extends MongoRepository<Order, String> {

	List<Order> findByCustomer(String customer);

	List<Order> findByCustomerLike(String customer);

	List<Order> findByCustomerAndType(String customer, String type);

	List<Order> getByType(String type);

	@Query("{customer:'Chuck Wagon'}")
	List<Order> findChucksOrders();

}
